perm filename IOSER.PRT[CMU,AIL] blob
sn#107780 filedate 1974-06-28 generic text, type T, neo UTF8
COMMENT ⊗Filnam ⊗
DSCR FILNAM
CAL PUSHJ
PAR file name string on SP stack
of form FILENAME<.EXT><[PROJ,PROG]>
RES FNAME(USER) : SIXBIT /filename/
EXT(USER): SIXBIT /extension,,0/
0
PRPN(USER): SIXBIT /PRJ PRG/ (or zero)
SID uses D,X,Y (4-6), REMOVES STRING FROM STACK
⊗
↑↑FILNAM:
SUB SP,X22 ;ADJUST STACK
FOR II←1,3 <
SETZM FNAME+II(USER)>
MOVEI X,FNAME(USER) ;WHERE TO PUT IT
PUSHJ P,FLSCAN ;GET FILE NAME
JUMPE Y,FLDUN ;FILE NAME ONLY
CAIE Y,"." ;EXTENSION?
JRST FLEXT ;NO, CHECK PPN
MOVEI X,FNAME+1(USER)
PUSHJ P,FLSCAN
FLEXT: JUMPE Y,FLDUN ;NO PPN SPECIFIED
CAIE Y,"["
JRST FLERR ;INVALID CHARACTER
CMU < ;HANDLE PPNS VIA UUO, MAYBE
HRRZS 1(SP) ;LENGTH PART
;SNEAK A LOOK AT FIRST CHAR
SKIPN 1(SP) ;IS THERE A FIRST CHAR?
JRST FLERR ; NO.
MOVE X,2(SP)
ILDB X,X
;;=C4= 1 of several LDE 28-Jun-74 allow null ppn within [].
CAIN X,"]" ;is it null?
JRST OCTPPN ; yes -- let the other guy handle it.
;;
CAIL X,"0"
CAILE X,"7"
SKIPA ; NOT OCTAL DIGIT
JRST OCTPPN
PUSH P,A ;NEED MORE ROOM
PUSH P,B
SETZM A ;CLEAR THE AREA
SETZM B
SETZM C
MOVEI D,=13+1 ;MAX #CHARS+1
MOVE X,[POINT 7,A] ;DUMP THEM THERE
FLN2: SOSGE 1(SP)
JRST FLERRC ;RAN OUT OF STRING
ILDB Y,2(SP) ;THE NEXT CHAR
;;=C4= 2 OF SEVERAL
JUMPE Y,FLN2 ;IGNORE NULLS
;;
CAIN Y,"]" ;THE END?
JRST GOTRB ; YES
JUMPLE D,FLERRC ;WE DON'T WANT ANY MORE CHARACTERS
IDPB Y,X ;STICK THE CHAR THERE
SOJA D,FLN2 ;GET ANOTHER
GOTRB: MOVEI X,A ;THATS WHERE THE UUO WILL FIND THEM
CALLI X,-2 ;CMUDEC UUO
JRST FLERRC ;SOMETHING WRONG
MOVEM X,FNAME+3(USER) ;SAVE IT
AOS -2(P) ;INDICATE SUCCESS
FLERRC: POP P,B
POP P,A
POPJ P,
OCTPPN:
>;CMU
PUSHJ P,[
RJUST: SETZM PROJ(USER)
MOVEI X,PROJ(USER)
PUSHJ P,FLSCAN ;GET PROJ OR PROG IN SIXBIT
IFN SIXSW,<
MOVE X,PROJ(USER)
IMULI D,-6 ;SHIFT FACTOR
LSH X,(D) ;RIGHT-JUSTIFY THE PROJ OR PROG
>;IF SIXSW (SET IN HEAD, USUALLY CONDITIONED ON NOEXPO)
IFE SIXSW,<
MOVEI X,0
;;#GT# DCS 5-11-72 ALLOW LARGE OCTAL NUMBERS AT STD DEC SYSTEMS
;;=C4= 3 OF several LE03 28-JUN-74 ALLOW NULL PPN
; MOVE D,PROJ(USER) ;WAS A HLLZ
SKIPN D,PROJ(USER)
POPJ P,
;;
;;
FBACK: MOVEI C,0
LSHC C,6 ;GET A SIXBIT CHAR
CAIL C,'0'
CAILE C,'7'
JRST FLERR ;INVALID OCTAL
LSH X,3
IORI X,-'0'(C)
JUMPN D,FBACK
>;NOT SIXSW (USUALLY CONDITIONED ON EXPO)
FPOP: POPJ P,]
HRLZM X,FNAME+3(USER)
CAIE Y,","
;;=C4 4 OF several
; JRST FLERR ;INVALID CHAR
JRST [JUMPE X,FLDUN1 ;ALLOW NULL PPN - CHECK FOR "]"
JRST FLERR] ;A REAL ERROR.
;;
PUSHJ P,RJUST ;JUSTIFY(AND CONVERT IF EXPORT) PROG #
HRRM X,FNAME+3(USER)
;;=C4= 5 OF several.
FLDUN1:
;;
CAIN Y,"]"
FLDUN: AOS (P) ;SUCCESSFUL
FLERR: POPJ P, ;DONE, NOT NECESSARILY RIGHT
ENDCOM(FIL)
COMPIL(FLS,<FLSCAN>,,<FLSCAN ROUTINE>)
COMMENT ⊗Flscan ⊗
DSCR FLSCAN
CAL PUSHJ
PAR X -- addr of destination SIXBIT
1(SP), 2(SP) -- input string
RES sixbit for next filename, etc in word addressed by X
break (punctuation) char in Y (0 if string exhausted)
D,X, input string adjusted
SID only those AC changes listed above (Y, for instance)
⊗
↑↑FLSCAN:
HRRZS 1(SP) ;WANT ONLY LENGTH PART
MOVEI D,6 ;MAX NUMBER PICKED UP
SETZM (X) ;ZERO DESTINATION
HRLI X,440600 ;BYTE POINTER NOW
FLN1: MOVEI Y,0 ;ASSUME NO STRING LEFT
SOSGE 1(SP) ;TEST 0-LENGTH STRING
POPJ P,
ILDB Y,2(SP) ;GET BYTE
CAIE Y,"." ;CHECK VALID BREAK CHAR
CAIN Y,"["
POPJ P,
CAIE Y,"]"
CAIN Y,","
POPJ P,
JUMPE D,FLN1 ;NEED NO MORE CHARS
;;=C4= 6 of several. IGNORE NULL CHARACTERS.
JUMPE Y,FLN2X
;;
TRZN Y,100 ;MOVE 100 BIT TO 40 BIT
TRZA Y,40 ; TO CONVERT TO SIXBIT
TRO Y,40 ; (NO CHECKING)
IDPB Y,X ;PUT IT AWAY
;;=C4= 7 of several
FLN2X:
;;
SOJA D,FLN1 ;CONTINUE
ENDCOM(FLS)
COMPIL(OPN,<OPEN,RELEASE,SETPL,CHNCDB>
,<GETCHN,SAVE,RESTR,CORGET,FLSCAN,SIMIO,X33,X22,X11,CORREL>
,<OPEN RELEASE AND SETPL FUNCTIONS>)
COMMENT ⊗
ERMAN'S IMPROVED BUFFER GETTER --- DEC. 1970
If a buffer size is specified (lh #buf word), allocate that size, else the
standard size (determined via a dummy XXXBUF, clever soul that LDE is).
"NOTICE WITH AWE THAT NO CORE IS EVER WASTED, AS IN THE INFERIOR OLD WAY" (sic).
⊗
MOVEI Z,0 ;FOR DUMMY (AND REAL) OUTBUF
PUSHJ P,GETBFS ;GET CORE, DO THE OUTBUFS (OR SIMULATIONS)
ADDI CDB,OBUF-OBPNT+1 ;RELOCATE FOR INPUT IN CDB
MOVEI Z,-1
PUSHJ P,GETBFS ;GET CORE, DO INBUFS
SUBI CDB,OBUF-OBPNT+1;RE-RELOCATE
CMU < ;FUNNY INPUT DEVICE
SKIPL DMODE(CDB) ;DID HE SPECIFY TO GET ERRS FROM
; BUFFER HEADER?
JRST STNIT ; NO.
HRLZI TEMP,400000
SKIPE IBUF(CDB) ;INPUT BUFFERS?
JRST [IORM TEMP,IBUF(CDB) ; YES
JRST STNIT]
SKIPE OBUF(CDB) ;OR OUTPUT BUFFERS?
JUMPA CHNL,[IORM TEMP,OBUF(CDB) ; YES
JRST STNIT]
ERR<OPEN: SPEECH DEV BUT NO BUFFERS, CHAN >,7
>;CMU
; FINISH OUT -- SET EOF FLAG IF DESIRED
STNIT: ;SETOM JOBFF ;ONE MUST KNOW WHAT HE IS DOING TO USE
MOVEM CDB,@CDBLOC(USER) ;STORE CDB ADDR IN CHANS TABLE
SETZM @ENDFL(CDB) ;MARK OPEN SUCCESSFUL
JRST RESTR ;RESTORE ACS, RETURN
BADOPN: HRRZ TEMP,JOBREN ;NEXT START WILL ASK ALLOC
HRRM TEMP,JOBSA ;QUESTION
ERR <TOO MANY CHANNELS OR I/O BUFFERS REQUESTED>,1,<(TEMP)>
RTRY: TERPRI <OPEN: DEVICE NOT AVAILABLE>
TERPRI <TYPE "R" TO RETRY, "X" TO GO ON WITHOUT>
PRINT <?>
PUUO TEMP
;;=C6= LDE 28-Jun-74
CAIE TEMP,"r"
;;
CAIN TEMP,"R" ;TRY AGAIN?
JRST AGNN ;YES
;;%##%
SETOM @ENDFL(CDB) ;MARK A LOSER
JRST NORELO
;;%##%
GETBFS: SETZM ONAME(CDB) ;CLEAR FILE NAME
HRRZ Y,OBUF(CDB) ;NUMBER OF BUFFERS
HLRZ D,OBUF(CDB) ;SIZE
EXPO <
HRRZS OBUF(CDB) ;MARK FOR SPECIAL TEST
>;EXPO
JUMPE Y,GBUFRT ;NO BUFFERS
JUMPE D,GETDES ;WANTS DEFAULT SIZE
ANDI D,7777 ;MAX BUFFER SIZE
HRLZ A,D ;SIZE IN LH
PUSHJ P,GETCOR ;GET THE CORE (SURPRISE!)
SETZM OCOWNT(CDB) ;IN CASE NO ACTUAL INBUF (OUTBUF) DONE
CAIL E,15 ;DUMP MODE?
JRST GBUFRT ; YES, DON'T ACTUALLY FUDGE UP BUFFERS
NOEXPO <;USE UINBF, UOUTBF
;;#GD# 01-25-72 DCS (1-2) set up JOBFF, Fix XCT, bad count
MOVEM B,JOBFF ;B FROM CORGET HAS BUFFER AREA ADDRESS
SUBI D,2 ;GETCOR INCREMENTED
;;#GD#
HRRZ C,Y
MOVE A,[UINBF C]
JUMPN Z,.+2
MOVE A,[UOUTBF C]
DPB CHNL,[POINT 4,A,12]
;;#GD# 01-25-72 DCS (2-2) (was XCT CHNL, clearly wrong)
XCT A ;DO THE ALLOCATIONS
;;#GD#
POPJ P,
>;NOEXPO
EXPO <
ADDI B,1 ;SECOND WORD
BUFC1: HRR A,B
SOJLE Y,BUFC2
ADD B,D ;NEXT ONE
MOVEM A,(B) ;MAKE POINT TO PREV
JRST BUFC1
BUFC2: MOVE B,OBUF(CDB) ;BACK TO FIRST
MOVEM A,1(B) ;LINK IT TOO
HRLI A,400000 ;RING-USE BIQ
MOVEM A,OBPNT(CDB) ;BUFFER PTR
POPJ P,
>;EXPO
GETCOR: ADDI D,2 ;+2 FOR ACCOUNTING
MOVE C,D
IMUL C,Y ;TOTAL CORE NEEDED
PUSHJ P,CORGET ;GRAB IT
ERR <OPEN: NOT ENUFF CORE FOR BUFFERS>
HRRZM B,OBUF(CDB) ;SAVE SO CAN RELEASE
POPJ P,
GETDES: MOVEI A,1 ;1 DUMMY BUFFER
CAIL E,15 ;GOOD OLD DUMP MODE?
JRST [MOVEI D,202 ;ASSUME THIS, SINCE INBUF/OUTBUF WON'T
JRST GDIT] ; WORK IN DUMP MODE
MOVEI TEMP,BRKDUM-1(USER)
MOVEM TEMP,JOBFF
PUSHJ P,GETIOB ;DUMMY IN/OUBUF
LDB D,[POINT 17,BRKDUM(USER),17] ;GET THE SIZE
GDIT: PUSHJ P,GETCOR ;GET THE CORE
SETZM OCOWNT(CDB) ;CLEAR BYTE COUNT
CAIL E,15 ;DUMP MODE?
JRST GBUFRT ;YES, NO BUFFER STRUCTURE
MOVEM B,JOBFF
MOVE A,Y ;NUMBER OF BUFFERS
PUSHJ P,GETIOB ;NOW FOR REAL
GBUFRT: SETOM JOBFF ;FOR SPITE
POPJ P,
GETIOB: SKIPN Z
XCT IOOUTBUF,SIMIO ;DO OUTBUF
SKIPE Z
XCT IOINBUF,SIMIO ;INBUF
POPJ P,
SUBTTL RELEASE